home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 November: Tool Chest / Dev.CD Nov 00 TC Disk 1.toast / Sample Code / Contributed / SpriteWorld / SpriteWorld Files / Headers / SpriteWorld.h < prev    next >
Encoding:
Text File  |  2000-10-06  |  12.6 KB  |  390 lines  |  [TEXT/CWIE]

  1. ///--------------------------------------------------------------------------------------
  2. //    SpriteWorld.h
  3. //
  4. //    Portions are copyright: © 1991-94 Tony Myles, All rights reserved worldwide.
  5. //
  6. //    Description:    constants, structures, and prototypes for sprite worlds
  7. ///--------------------------------------------------------------------------------------
  8.  
  9.  
  10. #ifndef __SPRITEWORLD__
  11. #define __SPRITEWORLD__
  12.  
  13. #ifndef __SWCOMMON__
  14. #include <SWCommonHeaders.h>
  15. #endif
  16.  
  17. #ifndef __SPRITELAYER__
  18. #include <SpriteLayer.h>
  19. #endif
  20.  
  21. #ifndef __SPRITEFRAME__
  22. #include <SpriteFrame.h>
  23. #endif
  24.  
  25. #ifndef __SPRITE__
  26. #include <Sprite.h>
  27. #endif
  28.  
  29. #ifndef __TILING__
  30. #include <Tiling.h>
  31. #endif
  32.  
  33.  
  34. #ifdef __cplusplus
  35. extern "C" {
  36. #endif
  37.  
  38. #if PRAGMA_ALIGN_SUPPORTED
  39. #pragma options align=mac68k
  40. #endif
  41.  
  42. ///--------------------------------------------------------------------------------------
  43. //    sprite world error constants
  44. ///--------------------------------------------------------------------------------------
  45.  
  46. enum
  47. {
  48.     kSystemTooOldErr             = 100,    // < System 7.0
  49.     kMaxFramesErr                = 101,    // attempt to exceed maximum number of frames for a sprite
  50.     kInvalidFramesIndexErr        = 102,    // frame index out of range
  51.     kNotCWindowErr                = 103,    // attempt to make a SpriteWorld from non-color WindowPtr
  52.     kNilParameterErr            = 104,    // nil SpritePtr, FramePtr, etc.
  53.     kWrongDepthErr                = 105,    // invalid pixel size for attempted function
  54.     kWrongMaskErr                = 106,    // invalid mask type for attempted function
  55.     kOutOfRangeErr                = 107,    // tileID, tileMap, or other value out of bounds
  56.     kTilingNotInitialized        = 108,    // tiling hasn't been initialized
  57.     kTilingAlreadyInitialized    = 109,    // tiling already initialized; can't be initialized again
  58.     kNullTileMapErr                = 110,    // no TileMap has ever been created/loaded
  59.     kTileMapNotLockedErr        = 111,    // the TileMap is not locked and can't be used until it is
  60.     kAlreadyCalledErr            = 112,    // the function was already called and can't be called again
  61.     kSpriteNotCompiledErr        = 113,    // the sprite must be compiled before drawProc can be set
  62.     kBadParameterErr            = 114,    // a parameter that was passed to the function is invalid
  63.     kSpriteAlreadyInLayer        = 115,    // the Sprite is already in a Layer, and can't be added to another
  64.     kNilFrameErr                = 116,    // the Frame this function acts on is NIL
  65.     kNotLockedErr                = 117,    // a structure that must be locked is not
  66.     k68kOnlyErr                    = 118    // can only be used from 68k code
  67. };
  68.  
  69. ///--------------------------------------------------------------------------------------
  70. //    UpdateRectStruct data structure
  71. ///--------------------------------------------------------------------------------------
  72.  
  73. typedef struct UpdateRectStruct UpdateRectStruct;
  74. typedef UpdateRectStruct *UpdateRectStructPtr;
  75.  
  76. struct UpdateRectStruct
  77. {
  78.     Rect                 updateRect;            // this rect
  79.     UpdateRectStructPtr nextRectStructP;    // next rect struct
  80. };
  81.  
  82.  
  83. ///--------------------------------------------------------------------------------------
  84. //    sprite world type definitions
  85. ///--------------------------------------------------------------------------------------
  86.  
  87. typedef SW_FUNC void (*WorldMoveProcPtr)(
  88.     SpriteWorldPtr spriteWorldP,
  89.     SpritePtr followSpriteP);
  90.  
  91. typedef SW_FUNC void (*CallBackPtr)(
  92.     SpriteWorldPtr spriteWorldP);
  93.  
  94. typedef void (*CleanUpCallBackPtr)( void );
  95.  
  96. typedef SW_FUNC void (*DoubleDrawProcPtr)(
  97.     FramePtr srcFrameP,
  98.     FramePtr dstFrameP, 
  99.     Rect *srcRectA,
  100.     Rect *dstRectA,
  101.     Rect *srcRectB,
  102.     Rect *dstRectB);
  103.  
  104. ///--------------------------------------------------------------------------------------
  105. //    sprite world data structure
  106. ///--------------------------------------------------------------------------------------
  107.  
  108. struct SpriteWorldRec
  109. {
  110.     SpriteLayerPtr headSpriteLayerP;    // head of the sprite layer linked list
  111.     SpriteLayerPtr tailSpriteLayerP;    // tail of the sprite layer linked list
  112.     SpriteLayerPtr deadSpriteLayerP;    // where SWRemoveSpriteFromAnimation puts Sprites
  113.     
  114.     UpdateRectStructPtr headUpdateRectP; // used by SWFlagRectAsChanged
  115.     
  116.     FramePtr extraBackFrameP;            // used when adding a background behind tiles
  117.     FramePtr backFrameP;                // frame for the background
  118.     FramePtr workFrameP;                // work, or "mixing" frame
  119.     FramePtr windowFrameP;                // frame for drawing to the screen
  120.     
  121.     DrawProcPtr offscreenDrawProc;        // callback for erasing sprites offscreen
  122.     DrawProcPtr screenDrawProc;            // callback for drawing sprite pieces onscreen
  123.     DoubleDrawProcPtr doubleRectDrawProc; // callback for updating screen when scrolling
  124.     
  125.     CallBackPtr postEraseCallBack;        // called after erasing sprites
  126.     CallBackPtr postDrawCallBack;        // called after drawing sprites
  127.     
  128.     Rect    windRect;                    // holds windowFrameP->frameRect for easier access
  129.     Rect    backRect;                    // holds backFrameP->frameRect for easier access
  130.     Rect    originalWindRect;            // used by SWChangeWorldRect and SWRestoreWindRect
  131.     Rect    originalBackRect;            // used by SWChangeWorldRect and SWRestoreWindRect
  132.     
  133.     Rect    visScrollRect;                // rect that is copied to screen when scrolling
  134.     Rect    oldVisScrollRect;            // visScrollRect from last frame
  135.     Rect    offscreenScrollRect;        // same as visScrollRect, but local to offscreen
  136.     short    horizScrollRectOffset;        // offset from offscreenScrollRect to visScrollRect
  137.     short    vertScrollRectOffset;        // offset from offscreenScrollRect to visScrollRect
  138.     short    horizScrollDelta;            // horizontal scrolling delta
  139.     short    vertScrollDelta;            // vertical scrolling delta
  140.     Rect    scrollRectMoveBounds;        // move bounds for visScrollRect
  141.     
  142.     WorldMoveProcPtr worldMoveProc;        // pointer to the scrolling world move procedure
  143.     SpritePtr followSpriteP;            // pointer to the "follow sprite", or NULL
  144.     
  145.     TileMapStructPtr *tileLayerArray;     // an array of all the tileMap layers
  146.     short        lastActiveTileLayer;    // the last active tile layer
  147.     Boolean        tilingIsInitialized;    // has the tiling been initialized yet?
  148.     Boolean        tilingIsOn;                // are the tiling routines turned on?
  149.     short        **tilingCache;            // two-dimensional tiling cache
  150.     short        numTilingCacheRows;        // number of rows in tilingCache array
  151.     short        numTilingCacheCols;        // number of cols in tilingCache array
  152.     FramePtr    *tileFrameArray;        // array of tile framePtrs
  153.     short        *curTileImage;            // array specifying the current frame of each tile
  154.     short        maxNumTiles;            // number of elements in tileFrameArray
  155.     short        tileWidth;                // width of each tile
  156.     short        tileHeight;                // height of each tile
  157.     long        numTilesChanged;        // number of rects in changedTiles array to update
  158.     Rect        *changedTiles;            // array of rects of tiles that changed
  159.     long        changedTilesArraySize;    // number of elements in changedTiles array
  160.     TileChangeProcPtr tileChangeProc;    // pointer to tile frame changing procedure
  161.     TileRectDrawProcPtr tileRectDrawProc; // pointer to the function that draws tiles in a rect
  162.     DrawProcPtr tileMaskDrawProc;        // drawProc for drawing masked tiles in tile layers
  163.     DrawProcPtr partialMaskDrawProc;    // drawProc for drawing partialMask tiles above sprites
  164.     
  165.     GDHandle     mainSWGDH;                // GDH used by the SpriteWorld's offscreen areas. Taken from the GDH the SpriteWorld's window was initially created in.
  166.     short         pixelDepth;                // SpriteWorld's depth
  167.     
  168.     short             fpsTimeInterval;    // milliseconds per frame of animation (1000/fps)
  169.     unsigned long    runningTimeCount;    // running total time in milliseconds
  170.     UnsignedWide     lastMicroseconds;    // value of previous Microseconds() call
  171.     unsigned long     timeOfLastFrame;    // time (from runningTimeCount) of last frame
  172.     VBLTaskRec         vblTaskRec;            // extended VBLTask record
  173.     Boolean         usingVBL;            // is the VBL task installed?
  174.     Boolean         frameHasOccurred;    // Has the SpriteWorld been processed?
  175.     Boolean            thereAreNonScrollingLayers; // used internally by SWProcessSpriteWorld
  176.  
  177.     Boolean            pad1;                // (note: Boolean is the same as an unsigned char)
  178.     
  179.     RGBColor        backgroundColor;    // background color for clear drawproc
  180.     unsigned long     backgroundValue;    // background pixel value for clear blitters
  181.  
  182.     long userData;                        // reserved for user
  183. };
  184.  
  185.  
  186. ///--------------------------------------------------------------------------------------
  187. //    sprite world globals
  188. ///--------------------------------------------------------------------------------------
  189.  
  190. extern SpriteWorldPtr        gSWCurrentSpriteWorld;
  191. extern SpritePtr            gSWCurrentSpriteBeingDrawn;
  192.  
  193. extern RgnHandle             gSWCollisionSectRgn;
  194. extern RgnHandle            gSWCollisionSpareRgn;
  195.  
  196. extern CleanUpCallBackPtr    gSWCleanUpCallBackP;
  197. extern SpriteWorldPtr        gSWCleanUpSpriteWorldP;
  198.  
  199. ///--------------------------------------------------------------------------------------
  200. //    sprite world function prototypes
  201. ///--------------------------------------------------------------------------------------
  202.  
  203.  
  204. SW_FUNC OSErr SWEnterSpriteWorld(void);
  205.  
  206. SW_FUNC void SWExitSpriteWorld(void);
  207.  
  208. SW_FUNC OSErr SWCreateSpriteWorld(
  209.     GDHandle         mainGDH,
  210.     SpriteWorldPtr     *spriteWorldP,
  211.     FramePtr         windowFrameP,
  212.     FramePtr         backFrameP,
  213.     FramePtr         workFrameP,
  214.     short             maxDepth);
  215.  
  216. SW_FUNC OSErr SWCreateSpriteWorldFromWindow(
  217.     SpriteWorldPtr*    spriteWorldP,
  218.     CWindowPtr        srcWindowP,
  219.     Rect*            worldRectP,
  220.     Rect*            offscreenRectP,
  221.     short             maxDepth);
  222.  
  223. SW_FUNC void SWDisposeSpriteWorld(
  224.     SpriteWorldPtr    *spriteWorldPP);
  225.  
  226. SW_FUNC void SWAddSpriteLayer(
  227.     SpriteWorldPtr spriteWorldP,
  228.     SpriteLayerPtr spriteLayerP);
  229.  
  230. SW_FUNC void SWRemoveSpriteLayer(
  231.     SpriteWorldPtr spriteWorldP,
  232.     SpriteLayerPtr spriteLayerP);
  233.  
  234. SW_FUNC void SWSwapSpriteLayer(
  235.     SpriteWorldPtr spriteWorldP,
  236.     SpriteLayerPtr srcSpriteLayerP,
  237.     SpriteLayerPtr dstSpriteLayerP);
  238.  
  239. SW_FUNC SpriteLayerPtr SWGetNextSpriteLayer(
  240.     SpriteWorldPtr spriteWorldP,
  241.     SpriteLayerPtr curSpriteLayerP);
  242.  
  243. SW_FUNC void SWLockSpriteWorld(
  244.     SpriteWorldPtr spriteWorldP);
  245.  
  246. SW_FUNC void SWUnlockSpriteWorld(
  247.     SpriteWorldPtr spriteWorldP);
  248.  
  249. SW_FUNC void SWSetPortToBackground(
  250.     SpriteWorldPtr spriteWorldP);
  251.  
  252. SW_FUNC void SWSetPortToWorkArea(
  253.     SpriteWorldPtr    spriteWorldP);
  254.  
  255. SW_FUNC void SWSetPortToWindow(
  256.     SpriteWorldPtr spriteWorldP);
  257.  
  258. SW_FUNC OSErr SWSetSpriteWorldOffscreenDrawProc(
  259.     SpriteWorldPtr spriteWorldP,
  260.     DrawProcPtr offscreenProc);
  261.  
  262. SW_FUNC OSErr SWSetSpriteWorldScreenDrawProc(
  263.     SpriteWorldPtr spriteWorldP,
  264.     DrawProcPtr drawProc);
  265.  
  266. SW_FUNC void SWSetPostEraseCallBack(
  267.     SpriteWorldPtr    spriteWorldP,
  268.     CallBackPtr        callBack);
  269.     
  270. SW_FUNC void SWSetPostDrawCallBack(
  271.     SpriteWorldPtr    spriteWorldP,
  272.     CallBackPtr        callBack);
  273.     
  274. SW_FUNC void SWSetSpriteWorldMaxFPS(
  275.     SpriteWorldPtr spriteWorldP,
  276.     short framesPerSec);
  277.  
  278. SW_FUNC void SWSetBackgroundColor(
  279.     SpriteWorldPtr spriteWorldP,
  280.     RGBColor *color);
  281.  
  282. SW_FUNC void SWStdWorldClearDrawProc(
  283.     FramePtr srcFrameP,
  284.     FramePtr dstFrameP,
  285.     Rect* srcRect,
  286.     Rect* dstRect);
  287.  
  288. SW_FUNC void SWStdWorldDrawProc(
  289.     FramePtr srcFrameP,
  290.     FramePtr dstFrameP,
  291.     Rect* srcRect,
  292.     Rect* dstRect);
  293.  
  294. SW_FUNC void SWInterlacedCopyBitsDrawProc(
  295.     FramePtr    srcFrameP,
  296.     FramePtr    dstFrameP,
  297.     Rect*        srcRect,
  298.     Rect*        dstRect);
  299.  
  300. SW_FUNC void SWCopyBackgroundToWorkArea(
  301.     SpriteWorldPtr spriteWorldP);
  302.  
  303. SW_FUNC OSErr SWChangeWorldRect(
  304.     SpriteWorldPtr spriteWorldP, 
  305.     Rect* newWorldRect,
  306.     Boolean changeOffscreenAreas);
  307.  
  308. SW_FUNC void SWRestoreWorldRect(
  309.     SpriteWorldPtr spriteWorldP);
  310.  
  311. SW_FUNC void SWWindowMoved( 
  312.     SpriteWorldPtr spriteWorldP);
  313.  
  314. SW_FUNC void SWWindowFrameMoved(
  315.     FramePtr windowFrameP,
  316.     Rect *frameRect);
  317.  
  318. SW_FUNC void SWUpdateWindow(
  319.     SpriteWorldPtr spriteWorldP);
  320.  
  321. SW_FUNC void SWUpdateSpriteWorld(
  322.     SpriteWorldPtr spriteWorldP,
  323.     Boolean updateWindow);
  324.  
  325. SW_FUNC void SWProcessSpriteWorld(
  326.     SpriteWorldPtr spriteWorldP);
  327.  
  328. SW_FUNC void SWProcessNonScrollingLayers(
  329.     SpriteWorldPtr spriteWorldP);
  330.  
  331. SW_FUNC void SWProcessSpriteLayer(
  332.     SpriteWorldPtr spriteWorldP,
  333.     SpriteLayerPtr curSpriteLayerP);
  334.  
  335. SW_FUNC void SWAnimateSpriteWorld(
  336.     SpriteWorldPtr spriteWorldP);
  337.  
  338. SW_FUNC void SWCheckIdleSpriteOverlap(
  339.     SpriteWorldPtr    spriteWorldP,
  340.     SpritePtr        idleSpriteP,
  341.     SpritePtr        headActiveSpriteP);
  342.  
  343. SW_FUNC void SWCheckIdleSpritesWithTiles(
  344.     SpriteWorldPtr    spriteWorldP,
  345.     SpritePtr        headIdleSpriteP);
  346.  
  347. SW_FUNC void SWCheckIdleSpritesWithRects(
  348.     SpriteWorldPtr    spriteWorldP,
  349.     SpritePtr        headIdleSpriteP);
  350.  
  351. SW_FUNC void SWFindSpritesToBeRemoved(
  352.     SpriteWorldPtr spriteWorldP );
  353.  
  354. SW_FUNC OSErr SWFlagRectAsChanged(
  355.     SpriteWorldPtr spriteWorldP,
  356.     Rect*    theChangedRect);
  357.  
  358. SW_FUNC OSErr SWFlagScrollingRectAsChanged(
  359.     SpriteWorldPtr spriteWorldP,
  360.     Rect*    theChangedRect);
  361.  
  362. SW_FUNC OSErr SWSyncSpriteWorldToVBL(
  363.     SpriteWorldPtr    spriteWorldP,
  364.     Boolean            syncingOn);
  365.     
  366. SW_FUNC void SWSetCleanUpSpriteWorld(
  367.     SpriteWorldPtr spriteWorldP);
  368.     
  369. SW_FUNC void SWSetCleanUpFunction(
  370.     CleanUpCallBackPtr callBackP);
  371.  
  372. SW_FUNC unsigned long SWGetSpriteWorldVersion( void );
  373.  
  374.  
  375. #if GENERATINGCFM
  376. void        SWVBLTask(VBLTaskRecPtr vblTaskPtr);/* Under CFM, we're passed the VBL task pointer */
  377. #else
  378. void        SWVBLTask(void);                    /* Otherwise, we'll have to get it out of register A0 */ 
  379. #endif
  380.  
  381.  
  382. #if PRAGMA_ALIGN_SUPPORTED
  383. #pragma options align=reset
  384. #endif
  385.  
  386. #ifdef __cplusplus
  387. }
  388. #endif
  389.  
  390. #endif /* __SPRITEWORLD__ */